package com.chiyoyo.multipay.framework.core.utils;

import javax.validation.*;
import java.util.Set;

/**
 * @author chil
 * 校验工具类
 */
public class ValidationUtils {

    private static final Validator VALIDATOR;

    static {
        try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
            VALIDATOR = factory.getValidator();
        }
    }

    /**
     * 对指定对象进行校验
     *
     * @param object 要进行校验的对象
     * @param groups 校验组，可以传入多个，用于指定不同的校验规则集合
     * @param <T>    泛型，代表要进行校验的对象的类型
     * @throws ConstraintViolationException 如果校验失败，将抛出此异常
     */
    public static <T> void validate(T object, Class<?>... groups) {
        validate(VALIDATOR, object, groups);
    }

    /**
     * 验证对象是否满足给定的验证规则
     *
     * @param validator 验证器，用于执行验证操作
     * @param object    待验证的对象
     * @param groups    验证组，用于指定需要验证的约束注解的组别，可以为空
     * @param <T>       待验证对象的类型
     * @throws ConstraintViolationException 如果验证失败，则抛出该异常
     */
    public static <T> void validate(Validator validator, T object, Class<?>... groups) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, groups);
        if (!constraintViolations.isEmpty()) {
            throw new ConstraintViolationException(constraintViolations);
        }
    }
}
